﻿// final_version.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <print>
#include <boost/asio.hpp>
#include <signal.h>
#include <cstring>  // 用于strerror

#include "server.h"

// 全局原子变量：控制服务是否运行
std::atomic<bool> g_server_running{ true };

// 信号处理：优雅停止服务
void signal_handler(int signum) {
    g_server_running = false;
    std::println("\n收到退出信号（{}），正在停止服务...", signum);
}

int main() {
    // 1. 初始化Python（主线程中执行，唯一入口）
    std::cout << "主线程：初始化Python..." << std::endl;
    if (!Py_IsInitialized()) {
        Py_Initialize();
        // 设置Python路径（确保能导入脚本中的模块）
        PyRun_SimpleString("import sys");
        PyRun_SimpleString("sys.path.append('.')");  // 当前目录
        PyRun_SimpleString("sys.path.append('./configs')");  // 配置文件目录（如果需要）
    }
    if (!Py_IsInitialized()) {
        std::cerr << "主线程：Python初始化失败，无法启动服务" << std::endl;
        return 1;
    }
    std::cout << "主线程：Python初始化成功" << std::endl;

    // 2. 注册信号处理（捕获Ctrl+C等）
    signal(SIGINT, signal_handler);
    signal(SIGTERM, signal_handler);

    try {
        // 3. 启动HTTP服务（包含Python线程）
        const std::string config_path = "config/port.yaml";
        std::println("主线程：加载配置文件: {}", config_path);

        SensorHTTPServer server(config_path);
        std::println("主线程：服务启动成功，监听地址: {}:{}", server.host, server.port);
        std::println("支持的HTTP接口:");
        std::println("  GET/POST /connect    - 连接传感器");
        std::println("  GET/POST /start      - 启动定时器（可带interval_ms参数）");
        std::println("  GET/POST /stop       - 停止定时器");
        std::println("  GET      /status     - 查询服务状态");
        std::println("  GET      /media/status - 查询media模块状态");
        std::println("按Ctrl+C停止服务...");

        // 4. 运行服务（阻塞，直到信号触发停止）
        server.start();

        // 5. 服务正常退出后的清理
        std::println("主线程：服务已停止，正在清理资源...");
    }
    catch (const std::exception& e) {
        std::cerr << "主线程：服务初始化失败: " << e.what() << std::endl;
        // 异常退出时清理Python
        if (Py_IsInitialized()) {
            Py_Finalize();
        }
        return 1;
    }

    // 6. 最终清理Python
    if (Py_IsInitialized()) {
        std::cout << "主线程：关闭Python..." << std::endl;
        Py_Finalize();
    }

    std::println("主线程：服务已完全停止");
    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
